import logging
import os
import sys
import psutil  # 新增psutil库用于系统监控


# 自定义日志颜色格式
class ColorFormatter(logging.Formatter):
    # ANSI 颜色代码
    COLORS = {
        'WARNING': '\033[93m',  # 黄色
        'INFO': '\033[92m',  # 绿色
        'ERROR': '\033[91m',  # 红色
        'CRITICAL': '\033[91m',  # 红色
        'DEBUG': '\033[94m',  # 蓝色
        'RESET': '\033[0m',  # 重置颜色
    }

    def format(self, record):
        # 获取原始日志文本
        message = super().format(record)
        # 根据日志级别添加颜色
        if record.levelname in self.COLORS:
            message = f"{self.COLORS[record.levelname]}{message}{self.COLORS['RESET']}"
        return message


# 获取系统资源使用情况
def get_system_usage():
    """获取CPU和内存使用率和总量"""
    # 获取CPU信息
    cpu_percent = psutil.cpu_percent(interval=0.1)  # 短间隔获取更实时数据
    cpu_count = psutil.cpu_count(logical=True)  # 逻辑核心数

    # 获取每个CPU核心的使用率
    cpu_percents = psutil.cpu_percent(interval=0.1, percpu=True)

    # 改进的活跃核心数计算
    # 根据总体CPU使用率动态调整阈值
    if cpu_percent > 0:
        # 动态阈值：总体使用率的1/3，但最低不低于0.5%
        threshold = max(0.5, cpu_percent / 3)
        active_cores = sum(1 for percent in cpu_percents if percent > threshold)
    else:
        active_cores = 0

    # 获取内存信息
    mem = psutil.virtual_memory()
    mem_total_gb = round(mem.total / (1024 ** 3), 2)  # 转换为GB，保留两位小数
    mem_used_gb = round(mem.used / (1024 ** 3), 2)  # 转换为GB，保留两位小数
    mem_percent = mem.percent

    # 格式化输出
    return f"CPU: ({active_cores}/{cpu_count} cores) MEM:{mem_percent}% ({mem_used_gb}GB/{mem_total_gb}GB)"


# 配置全局 logging
def setup_global_logging():
    # 创建根记录器
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)  # 设置全局日志级别

    # 创建控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)

    # 设置彩色格式化器（增加资源显示）
    formatter = ColorFormatter(
        fmt='%(asctime)s - %(levelname)s - [%(resource)s] %(message)s',  # 新增resource字段
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    console_handler.setFormatter(formatter)

    # 移除旧处理器（避免重复打印）
    if logger.hasHandlers():
        logger.handlers.clear()

    # 添加处理器
    logger.addHandler(console_handler)

    # 添加资源信息到日志记录
    old_factory = logging.getLogRecordFactory()

    def record_factory(*args, **kwargs):
        record = old_factory(*args, **kwargs)
        record.resource = get_system_usage()  # 动态添加资源信息
        return record

    logging.setLogRecordFactory(record_factory)

    # Windows 下启用 ANSI 颜色
    if sys.platform == "win32":
        os.system("color")  # 启用虚拟终端


# 初始化日志系统
setup_global_logging()

# 测试日志输出
logging.info("系统监控已启动")